#include <stdio.h>
#include "socket.h"
#include "main.h"
#include "wifi.h"

void socket_tcp_start_app(void)
{
     while (1)
    {
        if (xSemaphoreTake(sem, portMAX_DELAY) == pdPASS)
        {
            ESP_LOGI("tcp_start", "connected to ap!");
            ESP_LOGI("tcp_start", "begin_tcp");//释放信号量，开启socket任务
            break;
        }
    }
  int _socket;

createSocket:	// 标签

    _socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    // AF_INET表示IPv4，AF_INET6表示IPv6

    // SOCK_STREAM表示TCP；
    // SOCK_DGRAM表示UDP；
    // SOCK_RAW表示RAW

    // protocol， 规定套接字发送和接送哪类型协议数据。
    // 最常见的是 IPPROTO_TCP, IPPROTO_UDP, IPPROTO_UDPLITE、IPPROTO_ICMP。
    // 如果 domain 和 type已经确定唯一的协议，“0（IPPROTO_IP）” 可以用来表示选择一个默认的协议。

    if(_socket < 0){
        printf("Socket created failed: %d\n", errno);
        vTaskDelete(NULL);
    }else{
        printf("Socket Created OK");
    }

    struct sockaddr_in desk_addr = {
    // 服务器的IP地址，是ipv4
        .sin_addr.s_addr = inet_addr("192.168.18.101"),	
        .sin_family = AF_INET,
        .sin_port = htons(8000),    // 小端模式转为大端模式
    };


    int err;
    while (1) {
        err = connect(_socket, (struct sockaddr*)&desk_addr, sizeof(desk_addr));
        if (err == 0){
            ESP_LOGI("CLIENT", "Connected OK");
            break;
        }else{
            ESP_LOGI("CLIENT", "ERROR:%d", errno);
            close(_socket);
            vTaskDelay(pdMS_TO_TICKS(200));
            goto createSocket; // goto标签
        }
    }
    char rx_buffer[1024];
    while(1)
    {
        vTaskDelay(pdMS_TO_TICKS(200));
        /****************************************/
        /*发送接收测试*/
        // vTaskDelay(pdMS_TO_TICKS(1000));
        // char * data="hello";//要发送的数据
        // err = send(_socket,data,10, 0);//发送数据
        // ESP_LOGI("CLIENT", "send: rc: %d", err);
        int len = recv(_socket, rx_buffer, sizeof(rx_buffer) - 1, 0);
        if(len!=-1)
        {
            for(int i=0;i<1024;i++)
            {
                printf("%c",rx_buffer[i]);
            }
            printf("&&&&&&&&&&");
        }else{
            printf("connect_fail\n");

        }
        //这些都是测着玩的，下面的代码看小高大显身手
    }
}
